#include "btn_app.h"

// 定义用户按键ID枚举类型
typedef enum
{
    USER_BUTTON_0 = 0,
    USER_BUTTON_MAX
} UserButtenId_t;

// 定义按键参数
const ebtn_btn_param_t defaul_ebtn_param = EBTN_PARAMS_INIT(
    10,  // time_debounce: 按下消抖时间 (ms), 一般为 20ms
    10,  // time_debounce_release: 释放消抖时间 (ms), 一般为 20ms
    10,  // time_click_pressed_min: 按下至少多长时间算有效点击 (ms)
    300, // time_click_pressed_max: 按下最多多长时间算有效点击 (ms)
    100, // time_click_multi_max: 多击之间最大间隔时间 (ms)
    500, // time_keepalive_period: 长按触发周期 (ms), 0表示不触发长按事件 (注意长按周期应大于 time_click_pressed_max)
    5    // max_consecutive: 最大连续点击次数, 达到次数后立即发送 ONCLICK 事件
);

// 注册按键ID
ebtn_btn_t btns[] = {
    EBTN_BUTTON_INIT(USER_BUTTON_0, &defaul_ebtn_param)
};

// 事件循环函数：获取按键状态
uint8_t Btn_Get_State(struct ebtn_btn *btn)
{
    uint8_t state = 0;
    switch (btn -> key_id)
    {
        case USER_BUTTON_0:
            state = (DL_GPIO_readPins(BTN_PORT, BTN_PIN_21_PIN) == 0);
            break;
    }
    return state;
}

// 回调函数：处理按键事件
/**
 * EBTN_EVT_ONPRESS     当按键按下时,将事件发送给应用程序
 * EBTN_EVT_ONRELEASE   当按键抬起时,将事件发送给应用程序
 * EBTN_EVT_KEEPALIVE   当按键长按时,将事件定期发送给应用程序
 * EBTN_EVT_ONCLICK     仅当按键完成单击动作时,将事件发送给应用程序
 */
void Btn_Event_Callback(struct ebtn_btn *btn, ebtn_evt_t evt)
{
    switch (btn -> key_id) 
    {
        case USER_BUTTON_0:
            //  按键单击反转LED亮灭状态
            if (evt == EBTN_EVT_ONCLICK)
            {
                ucled = ucled ? 0 : 1;
            }
            break;
    }
}

// 初始化按键驱动
void Btn_Init(void)
{
    ebtn_init(btns, EBTN_ARRAY_SIZE(btns), NULL, 0, Btn_Get_State, Btn_Event_Callback);
}

void Btn_Task(void)
{
    ebtn_process(uwTick);
}